//
//  HMRrefreshView.swift
//  HMWeiBo
//
//  Created by Apple on 16/8/4.
//  Copyright © 2016年 itheima. All rights reserved.
//

import UIKit

// 声明一个枚举来记录状态
enum HMRefreshStatus: Int {
    ///正常状态
    case Normal = 1
    ///释放去加载数据状态 -- 拖拽状态
    case Pulling = 2
    ///加载数据
    case Loading = 3
    
}

class HMRrefreshView: UIControl {

    // 定义成一个属性,方便类使用
    var scrollView: UIScrollView?
    
    // 定义一个属性,来记录状态
    var status: HMRefreshStatus = .Normal{
        // 优化
        didSet{
            
            // 统一来处理这三种状态
            switch status {
            
            case .Normal: messageLabel.text = "下拉刷新"
                printLog("正常状态")
                UIView.animateWithDuration(0.25, animations: { () -> Void in
                    // 让我们的箭头恢复回去
                    self.arrowImageView.transform = CGAffineTransformIdentity
                })
                
            //隐藏箭头
            self.arrowImageView.hidden = false
            // 菊花开始转动
            self.loadingView.stopAnimating()
            
            self.loadingView.hidden = true
                
            case .Pulling: messageLabel.text = "释放刷新"
                UIView.animateWithDuration(0.25, animations: { () -> Void in
                    self.arrowImageView.transform = CGAffineTransformMakeRotation(CGFloat(M_PI))
                })
                printLog("释放状态")
            case .Loading: messageLabel.text = "加载中"
                    printLog("加载中")
                UIView.animateWithDuration(0.25, animations: { () -> Void in
                    // 让加载的view停留一下
                    var inset = self.scrollView!.contentInset
                    
                    inset.top = inset.top + 50
                    
                    self.scrollView?.contentInset = inset
                })
                //隐藏箭头
                self.arrowImageView.hidden = true
                // 菊花开始转动
                self.loadingView.startAnimating()
                
                self.loadingView.hidden = false
                
                // 变成加载状态的时候,应该去加载数据
                // 根据事件去触发方法
            // 实在接受不了,再用闭包/代理/通知去实现
                sendActionsForControlEvents(UIControlEvents.ValueChanged)
            }
            
        }
        
    }
    
    // 第一步: 重写父类的构造函数
    override init(frame: CGRect) {
        super.init(frame: frame)
        
        setupUI()
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
//    override func addSubview(view: UIView) {
//        super.addSubview(view)
//    }
    
    // 子控件将要添加到父类控件上去,会调用这个方法
    override func willMoveToSuperview(newSuperview: UIView?) {
        super.willMoveToSuperview(newSuperview)
        
        print(newSuperview)
        
        
        // 我们就可以把监听方法添加到这里
        
        // 我们把他转换成 UIScrollView ,这样所有集成自UIScrollView的子类都可以用我们的下拉刷新了
        
        if newSuperview is UIScrollView {
            
             scrollView = newSuperview as? UIScrollView
            
            // 给scrollView 添加KVO
            scrollView?.addObserver(self, forKeyPath: "contentOffset", options: NSKeyValueObservingOptions.New, context: nil)
        }
        
        
    }
    
    override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
        
//        print(scrollView?.contentOffset.y)
//        
        
        // 找的一个东西就是松手
        // scrollView需要强制解包
        
        if scrollView!.dragging {
            
           // 分析 正常状态和 释放更新的 2中状态, 是根据 scrollView?.contentOffset.y < -140 这个值来判断
            if scrollView?.contentOffset.y < -140 && status == .Normal{
                
//                printLog("状态改变了 ,释放来下拉刷新")
                status = .Pulling
            
                
                
                
            } else if scrollView?.contentOffset.y >= -140 && status == .Pulling{
                
//                printLog("正常状态~~~~~~")
                
                status = .Normal
                
                
                
            }

            
        }else {
            // 松手才可以去加载数据
//            printLog("~~~~~")
            
            if scrollView?.contentOffset.y < -140 && status == .Pulling{
                
//                printLog("去加载数据")
                
                status = .Loading
            }
        }
    }
    
    // 加载完成
    func endRefreshing(){
        
        if status == .Loading {
            
            // 我们下拉刷新之后,才让他恢复??? 怎么才能知道我们下拉刷新???
            // 第一个 让视图位置恢复
            UIView.animateWithDuration(0.25, animations: { () -> Void in
                // 让加载的view停留一下
                var inset = self.scrollView!.contentInset
                
                inset.top = inset.top - 50
                
                self.scrollView?.contentInset = inset
            })
            
        }
        
        
        // 第二个,改变 文字
        status = .Normal
    }
    
    // 第二步: 定义一个添加子类和设置子类控件约束的方法
    private func setupUI(){
        
        backgroundColor = UIColor.yellowColor()
        
        // 给下拉刷新一个默认 宽和高
        
        // 1. 拿到系统的frame
        var frame = self.frame
        // 2. 设置宽和高
        frame.size = CGSizeMake(kUIScreenWidth, 50)
        // 3. 修改frame的y值
        frame.origin.y = -50
        // 4.赋值给系统的frame
        self.frame = frame
        
        
        // 添加控件
        
        addSubview(arrowImageView)
        addSubview(messageLabel)
        addSubview(loadingView)
        
        // 设置约束
        arrowImageView.snp_makeConstraints { (make) -> Void in
            make.centerX.equalTo(self.snp_centerX).offset(-30)
            make.centerY.equalTo(self.snp_centerY)
        }
        
        messageLabel.snp_makeConstraints { (make) -> Void in
            make.left.equalTo(arrowImageView.snp_right).offset(10)
            make.centerY.equalTo(self.snp_centerY)
        }
        
        loadingView.snp_makeConstraints { (make) -> Void in
            make.centerX.equalTo(self.snp_centerX).offset(-30)
            make.centerY.equalTo(self.snp_centerY)
        }
        
//        loadingView.startAnimating()
    }
    
    //第三步: 懒加载控件
    //MARK:-- 懒加载控件

    private lazy var arrowImageView: UIImageView = {
    
        let img = UIImageView()
        
        img.image = UIImage(named: "tableview_pull_refresh")
        
        return img
    }()
    
    private lazy var messageLabel: UILabel = {
    
        let label = UILabel()
        
        label.text = "下拉刷新"
        
        return label
        
    }()
    
    private lazy var loadingView:UIActivityIndicatorView = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.Gray)
    
}
